#include<iostream>
using namespace std;
#define maxn 100010
#define ll long long
ll w[maxn*4];
ll a[maxn];
ll lazyj[maxn*4];
ll lazyc[maxn*4];
ll p;
void pushup(int u){
    w[u]=(w[u*2]+w[u*2+1])%p;
}
void build(ll u,ll l, ll r){
    lazyc[u]=1;
    if(l==r){
        w[u]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(u*2,l,mid);
     build(u*2+1,mid+1,r);
     pushup(u);
}
void maketag(int u,int l,int r,int op,ll x){
    if(op==1){
        (lazyj[u]*=x)%=p;
        (lazyc[u]*=x)%=p;
        (w[u]*=x)%=p;
    }
    if(op==2){
        (lazyj[u]+=x)%=p;
        (w[u]+=(r-l+1)*x)%=p;
    }
}
void pushdown(int u,int l,int r){
    int mid=(l+r)>>1;
    maketag(u*2,l,mid,1,lazyc[u]);
    maketag(u*2,l,mid,2,lazyj[u]);
    maketag(u*2+1,mid+1,r,1,lazyc[u]);
    maketag(u*2+1,mid+1,r,2,lazyj[u]);
    lazyc[u]=1;
    lazyj[u]=0;
}
bool inrange(int L,int R,int l ,int r){
    return((L>=l)&&(R<=r));
}
bool outrange(int L,int R,int l ,int r){
    return((L>r)||(R<l));
}
void xg(ll u,ll L,ll R,ll l,ll r,ll op,ll x){
    if(inrange(L,R,l,r)){
        maketag(u,L,R,op,x);
        return;
    }
     if(!outrange(L,R,l,r)){
        pushdown(u,L,R);
        ll mid=(L+R)>>1;
        xg(u*2,L,mid,l,r,op,x);
        xg(u*2+1,mid+1,R,l,r,op,x);
        pushup(u);
    }
}
ll cx(int u, int L, int R, int l, int r){
    if (inrange(L, R, l, r)) return w[u];  // 完全包含的情况
    else {
        if (outrange(L, R, l, r)) {
            return 0;  // 完全不包含的情况
        }
        else {
            pushdown(u, L, R);  // 推送标记
            int mid = (L + R) >> 1;
            return (cx(u*2, L, mid, l, r) %p+ cx(u*2+1, mid+1, R, l, r)%p)%p;
        }
    }
}
int main(){
    int n,m;
    cin>>n>>m>>p;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int x;
        scanf("%d",&x);
        if(x==3){
            int z,y;
             scanf("%d%d",&y,&z);
            cout<<cx(1,1,n,y,z)<<endl;
        }
        else{
            int y,z,k;
              scanf("%d%d%d",&y,&z,&k);
            xg(1,1,n,y,z,x,k);
        }
    }
    return 0;
}